# 定义激活函数
def Sigmoid(x):
    return 1. / (1. + np.exp(-x))
# 创建样本数据
x = np.arange(-8, 8, 0.02) # x.shape:(800,)
x_n = x.reshape(-1, 1) # x_n.shape:(800,1)
array_1d = np.ones(x.shape[0]) 
#元素的值为1，如图1-42的输入层值为“1”神经元

array_one = array_1d.reshape(-1, 1) # (800,1)
# 在第一个矩阵后面加上第二个矩阵（加一列）：
x_input = np.concatenate((x_n, array_one), axis=1) # (800,2) 

"""
x_input:
[[-8.    1.  ],
 [-7.98  1.  ],
 [-7.96  1.  ],
 ... ...
 [7.96  1.  ],
 [7.98  1.  ]]
"""

# 设置权重参数 w1
w1 = np.array([[-2, 4, 4],
                  [4, -20,-29]]) #(2,3)

# 第一步：linear(x) = W1 ∗ X + B1
linear_o = np.matmul(x_input,w1)
# 第二步：hidden(x) = Sigmoid( linear(x) )
hidden_out = Sigmoid(linear_o)

# 设置权重参数 w2
w2 = np.array([[4],
                  [2],
                  [-4]]) #(3,1)
b2 = np.array([1])
# 第三步：y=f(x) = linear(hidden(x))
y = np.matmul(hidden_out,w2) + b2 # (800,1)

# 可视化输出
fig = plt.figure()
ax = plt.gca()
ax.spines['right'].set_color('none')  # 将图像右边的轴设为透明
ax.spines['top'].set_color('none')  # 将图像上面的轴设为透明
ax.xaxis.set_ticks_position('bottom')  # 将x轴刻度设在下面的坐标轴上
ax.yaxis.set_ticks_position('left')  # 将y轴刻度设在左边的坐标轴上
ax.spines['bottom'].set_position(('data', 0))  # 将两个坐标轴的位置设在数据点原点
ax.spines['left'].set_position(('data', 0))
ax.plot(x, y.reshape(-1))
plt.show()
